package org.go.test;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/*

 在这个例子中启动了默认三个线程的线程池，调度两个周期性任务。第一个任务是每隔1秒执行一次，第二个任务是以固定1秒的间隔执行，这两个任务每次执行的时间都是2秒。上面的输出有以下几点结论：
任务是在多线程中执行的，同一个任务应该是在同一个线程中执行。 
scheduleAtFixedRate是每次相隔相同的时间执行任务，如果任务的执行时间比周期还长，那么下一个任务将立即执行。例如这里每次执行时间2秒，而周期时间只有1秒，那么每次任务开始执行的间隔时间就是2秒。 
scheduleWithFixedDelay描述是下一个任务的开始时间与上一个任务的结束时间间隔相同。流入这里每次执行时间2秒，而周期时间是1秒，那么两个任务开始执行的间隔时间就是2+1=3秒。 
  */
public class ScheduledExecutorServiceDemo {
	public static void main(String[] args) throws Exception {
		ScheduledExecutorService execService = Executors.newScheduledThreadPool(3);
		execService.scheduleAtFixedRate(new Runnable() {
			@Override
			public void run() {
				System.out.println(Thread.currentThread().getName() + " -> " + System.currentTimeMillis());
				try {
					Thread.sleep(2000L);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}, 1, 1, TimeUnit.SECONDS);
		//
		execService.scheduleWithFixedDelay(new Runnable() {
			@Override
			public void run() {
				System.out.println(Thread.currentThread().getName() + " -> " + System.currentTimeMillis());
				try {
					Thread.sleep(2000L);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}, 1, 1, TimeUnit.SECONDS);
		Thread.sleep(5000L);
		execService.shutdown();
	}
}